package br.gov.ibama.client.visao.dadosPessoais;

import java.util.ArrayList;
import java.util.List;

import br.gov.ibama.client.AuthService;
import br.gov.ibama.client.AuthServiceAsync;
import br.gov.ibama.client.componentes.BasisComponentes;
import br.gov.ibama.client.constantes.ConstantesDS;
import br.gov.ibama.client.constantes.ConstantesFields;
import br.gov.ibama.client.visao.VisaoPopup;
import br.gov.ibama.shared.Usuario;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Label;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.DSCallback;
import com.smartgwt.client.data.DSRequest;
import com.smartgwt.client.data.DSResponse;
import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.rpc.RPCResponse;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.ImgButton;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.fields.FormItem;
import com.smartgwt.client.widgets.form.fields.HiddenItem;
import com.smartgwt.client.widgets.form.fields.TextItem;

public class VisaoPopupDadosPessoais extends VisaoPopup{

	public static final AuthServiceAsync authService = GWT
			.create(AuthService.class);
	
	public VisaoPopupDadosPessoais(String title) {
		super (title);
	}

	protected List<ImgButton> getBotoes (){
		List<ImgButton> listaBotoes = new ArrayList<ImgButton>();
		listaBotoes.add(getBotaoSalvar());
		listaBotoes.add(getBotaoCancelar());
		return listaBotoes;
	}
	
	private ImgButton getBotaoSalvar(){
		ImgButton Salvar = BasisComponentes.criaImgButton("Salvar", "salvar_32x32.png");
		Salvar.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				
				if (validaCampos()) {
					
					FormItem cidade = getFormulario().getItem(ConstantesFields.FIELD_CIDADE_ID);
					Criteria criteria = new Criteria();
					criteria.addCriteria(ConstantesFields.FIELD_CIDADE_ID, cidade.getValue().toString());
					DataSource.get(ConstantesDS.DS_CIDADE).fetchData(criteria, new DSCallback() {
						
						@Override
						public void execute(DSResponse response, Object rawData, DSRequest request) {
							if (response.getDataAsRecordList().isEmpty()) {
								SC.warn("A cidade digitada não está cadastrada! Por favor, utilize o botão de seleção.");
							} else {
								Record record = formulario.getValuesAsRecord();
								DataSource.get(ConstantesDS.DS_ENDERECO).updateData(record,new DSCallback() {
									
									@Override
									public void execute(DSResponse response, Object rawData, DSRequest request) {
										if (!response.getDataAsRecordList().isEmpty()) {
											Record record = formulario.getValuesAsRecord();
											DataSource.get(ConstantesDS.DS_FUNCIONARIO).updateData(record,new CallBackSalvarEditar());							
										}
										
									}
								});				
							}														
						}
					});							
				}
			}
		});
		return Salvar;
	}
		
	private ImgButton getBotaoCancelar(){
		ImgButton Cancelar = BasisComponentes.criaImgButton("Cancelar", "cancelar_32x32.png");
		Cancelar.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				destroy();
				
			}
		});
		return Cancelar;
	}
	
	public void criaFormulario(){
		preparaFormulario(ConstantesDS.DS_FUNCIONARIO, getListaCamposFormulario());
		authService.getUsuarioDaSessao(new AsyncCallback<Usuario>() {

			@Override
			public void onSuccess(Usuario usuario) {
				if (usuario != null && usuario.getLogin() != null && !usuario.getLogin().isEmpty()) {
					Criteria criteria = new Criteria(ConstantesFields.FIELD_FUNCIONARIO_LOGIN, usuario.getLogin());
					getFormulario().fetchData(criteria);
				}				
			}
			
			@Override
			public void onFailure(Throwable caught) {
				DialogBox mensagem = new DialogBox();
				mensagem.setText("Ops! Erro inesperado");			
				mensagem.setWidget(new Label("Por favor, entre em contato com o suporte"));
				mensagem.show();
				mensagem.center();
				mensagem.setAutoHideEnabled(true);
			}
			
		});
	}
	
	public FormItem[] getListaCamposFormulario(){
		return getCamposFormulario().toArray(new FormItem[getCamposFormulario().size()]);
	}
	
	private List<FormItem> getCamposFormulario(){		
		
		List<FormItem> listaCampos = new ArrayList<FormItem>();
		
		TextItem cpf = BasisComponentes.criaTextItemPequeno(ConstantesFields.FIELD_FUNCIONARIO_CPF);
		cpf.setMask("###.###.###-##");
		cpf.setCanEdit(false);
		listaCampos.add(cpf);
		
		TextItem login = BasisComponentes.criaTextItemRequeridoPequeno(ConstantesFields.FIELD_FUNCIONARIO_LOGIN, "Login");
		login.setCanEdit(false);
		listaCampos.add(login);
		
		TextItem cargo = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_FUNCIONARIO_CARGO, "Cargo");
		cargo.setCanEdit(false);
		cargo.setOptionDataSource(DataSource.get(ConstantesDS.DS_CARGO));
		cargo.setDisplayField(ConstantesFields.FIELD_CARGO_DESCRICAO);
		cargo.setValueField(ConstantesFields.FIELD_CARGO_ID);
		listaCampos.add(cargo);
		
		TextItem nome = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_FUNCIONARIO_NOME, "Nome");
		listaCampos.add(nome);

		TextItem rg = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_FUNCIONARIO_RG, "RG");
		listaCampos.add(rg);

		TextItem matricula = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_FUNCIONARIO_MATRICULA, "Matrícula");
		listaCampos.add(matricula);
		
		HiddenItem idEndereco = new HiddenItem(ConstantesFields.FIELD_ENDERECO_ID);
		listaCampos.add(idEndereco);
		
		TextItem logradouro = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_LOGRADOURO, "Logradouro");
		listaCampos.add(logradouro);
		
		TextItem numero = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_NUMERO, "Número");
		listaCampos.add(numero);

		TextItem bairro = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_BAIRRO, "Bairro");
		listaCampos.add(bairro);
		
		TextItem cidade = BasisComponentes.criaComboboxObrigatorioGrande(ConstantesFields.FIELD_ENDERECO_CIDADE_ID, "Cidade");
		cidade.setOptionDataSource(DataSource.get(ConstantesDS.DS_CIDADE));
		cidade.setDisplayField(ConstantesFields.FIELD_CIDADE_NOME);
		cidade.setValueField(ConstantesFields.FIELD_CIDADE_ID);
		listaCampos.add(cidade);
		
		TextItem cep = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_CEP, "CEP");
		cep.setMask("##.###-###");
		listaCampos.add(cep);
		
		TextItem pontoReferencia = BasisComponentes.criaTextItemRequeridoGrande(ConstantesFields.FIELD_ENDERECO_PONTO_REFERENCIA, 
				"Ponto de Referência");
		listaCampos.add(pontoReferencia);
		
		return listaCampos;
		
		
	}
	
	private boolean validaCampos() {
		FormItem login = getFormulario().getItem(ConstantesFields.FIELD_FUNCIONARIO_LOGIN);
		FormItem nome = getFormulario().getItem(ConstantesFields.FIELD_FUNCIONARIO_NOME);
		FormItem rg = getFormulario().getItem(ConstantesFields.FIELD_FUNCIONARIO_RG);
		FormItem logradouro = getFormulario().getItem(ConstantesFields.FIELD_ENDERECO_LOGRADOURO);
		FormItem cidade = getFormulario().getItem(ConstantesFields.FIELD_ENDERECO_CIDADE_ID);
		
		// Verifica preenchimento dos campos obrigatórios
		if (isVazio(login) || isVazio(nome) || isVazio(rg) || isVazio(logradouro) || isVazio(cidade)) {
			SC.warn("Há campos obrigatórios não preenchidos.");
			return false;
		}
		return true;
	}
	
	protected boolean isVazio(FormItem item){
		return item == null || item.getValue() == null || item.getValue().toString().equals("");	
	}
	
	private final class CallBackSalvarEditar implements DSCallback {
		@Override
		public void execute(DSResponse response, Object rawData, DSRequest request) {
			if (RPCResponse.STATUS_SUCCESS == response.getStatus()) {
				SC.say("Dados pessoais alterados com sucesso!");
				destroy();
			} else if (RPCResponse.STATUS_VALIDATION_ERROR == response.getStatus()) {
				formulario.setErrors(response.getErrors(), true);
				SC.say("Existem erros de valida��o, por favor verificar os dados informados.");
			} else if (RPCResponse.STATUS_FAILURE == response.getStatus()) {
				SC.say("Falha ao executar a opera��o.");
			}
		}
		
	}


}
